﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <string>

using namespace std;
//class Student;
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//
//class Student : public Person
//{
//	friend void Display(const Person& p, const Student& s);
//protected:
//	int _stuNum; // 学号
//};
//
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	cout << s._stuNum << endl;
//}

//class Person
//{
//public:
//	Person() { ++_count; }
//	Person(const Person& p) { ++_count; }
//
//protected:
//	string _name; // 姓名
//public:
//	static int _count; // 统计人的个数。
//};
//
//int Person::_count = 0;
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//class Graduate : public Student
//{
//protected:
//	string _seminarCourse; // 研究科目
//};
//
//int main()
//{
//	// _count 静态成员只有一份，共用的
//	// 父类静态成员属于当前类，也属于当前类的所有派生类
//	Person p;
//	Student s1;
//	Student s2;
//	Student s3(s1);
//	Graduate g1;
//
//	cout << &Person::_count << endl;
//	cout << &Student::_count << endl;
//
//	cout << Student::_count << endl;
//	cout << Person::_count << endl;
//
//	return 0;
//}
//
//class Person
//{
//public:
//	string _name; // 姓名
//};
//
//class Student : virtual public Person
//{
//protected:
//	int _num; //学号
//};
//
//class Teacher : virtual public Person
//{
//protected:
//	int _id; // 职工编号
//};
//
//class Assistant : public Student, public Teacher
//{
//protected:
//	string _majorCourse; // 主修课程
//};
//
//
//void Test()
//{
//	// 这样会有二义性无法明确知道访问的是哪一个
//	Assistant a;
//	a._name = "peter";
//
//	// 需要显示指定访问哪个父类的成员可以解决二义性问题，但是数据冗余问题无法解决
//	a.Student::_name = "xxx";
//	a.Teacher::_name = "yyy";
//}
//
////int main()
////{
////	Test();
////
////	return 0;
////}
//
//class A
//{
//public:
//	int _a;
//};
//
////class B : public A
//class B : virtual public A
//{
//public:
//	int _b;
//	int _b1;
//	int _b2;
//
//};
//
////class C : public A
//class C : virtual public A
//{
//public:
//	int _c;
//};
//class D : public C, public B
//{
//public:
//	int _d;
//};

//int main()
//{
//	D d;
//	d.B::_a = 1;
//	d.C::_a = 2;
//
//	d._a = 0;
//	d._b = 3;
//	d._c = 4;
//	d._d = 5;
//
//	// 切片时，指针偏移，指向自己的对象位置
//	B* pb = &d;
//	C* pc = &d;
//	pb->_a++;
//	pc->_a++;
//
//
//  了解一下
//	B bb;
//	bb._a = 1;
//	bb._b = 2;
//
//	pb = &bb;
//	pb->_a++;
//
//
//	return 0;
//}

//class A
//{
//private:
//	int _a;
//};
//
//// 组合
//class B
//{
//private:
//	A _aa;
//	int _b;
//};

class Person {
public:
	virtual void BuyTicket() { cout << "Person->买票-全价" << endl; }
};

class Student : public Person {
public:
	virtual void BuyTicket() { cout << "Student->买票-半价" << endl; }
};

//virtual void func()
//{}

// 多态：指向谁，调用谁的虚函数
// 1、父子类完成虚函数重写(三同：函数名、参数、返回值)
// 2、父类的指针或者引用去调用虚函数
void Func(Person* p)
{
	// 不同的对象去做同一件事情，多种形态，结果不一样
	p->BuyTicket();
}

// 大数据杀熟
int main()
{
	Person ps;
	Student st;

	Func(&ps);
	Func(&st);

	return 0;
}
